这里简单记录下自己目前掌握的pytest知识,后续用到更多再来补充。
pytest的安装
1 | pip3 install -U pytest |
1 | pytest --version # 查看版本 |
pytest基本用法
单个测试
我们来看一个小例子
1 | # func.py |
在func.py
所在目录下启动pytest
1 | pytest func.py |
得到结果
1 | joseph@MacBook-Pro ~/work/lab/pytesttest pytest func.py |
由此可以看出
- 单个测试时,可以在命令行直接以
pytest 要测试的.py
的方式来执行测试。文件名无需test_
开头 - 执行测试时,会自动执行文件中的
test_
开头的方法 - 在测试方法中,可以直接使用
assert
,而无需像unittest
一样记住许多类似于assertEquals()
之类的方法。
多个测试
多个测试时可以直接在当前目录下执行命令
1 | $ pytest |
会自动寻找并执行当前目录及其包含的子目录下所有以test_
为前缀或者以_test
为后缀的文件。也就是遵循standard test discovery rules
对Exception
的assert
1 | import pytest |
在test_mytest
函数中,断言函数f
会抛出SystemExit
异常。
将多个test整合到一个类里
比如这样
class TestClass:
def test_one(self):
x = 'this'
assert 'h' in x
def test_two(self):
x = 'hello'
assert hasattr(x, 'check')
- 无需继承任何子类
- 可以直接在命令行用
pytest
执行,遵循standard test discovery rules
pytest进阶
fixtures
更多可参考
这里记录一种常见的用法。
我们在unittest
中可以用setUp()
和tearDown()
来实现测试环境的构造和析构。
比如一个测试数据库中取出的数据是否正确的类,setUp()
中可以写连接数据库的代码,tearDown()
中可以写释放数据库连接的代码。在执行每个测试方法时,setUp()
和tearDown()
都会分别在开始和结尾处执行,这样在测试方法中就可以专注于测试逻辑,而无需在每一个测试函数中都写一次连接和释放代码。
那我们在pytest
中怎么实现呢?
答案就是运用fixture
比如我们每个测试方法都需要一个SMTP类的实例。
1 | # test_func.py |
pytest常用参数
1 | pytest -q test.py # quiet reporting mode. 减少输出信息。 |